import { IContext, IEntityLocalDataService, IParam } from '@/core';
import { IIBIZBOOK } from '../interface/i-ibizbook';
import keys from '../ibizbook-keys';


/**
 * IBIZBOOKDTODTO辅助类
 * 基于template/src/api/{{appEntities}}/data-service/{{appEntities}}-help.ts.hbs生成  
 *
 * @export
 * @class IBIZBOOKDTOHelp
 */
export class IBIZBOOKDTOHelp {

    /**
     * 获取实体数据服务
     *
     * @static
     * @param {IParam} context
     * @return {*}  {Promise<IEntityLocalDataService<IIBIZBOOK>>}
     * @memberof IBIZBOOKDTOHelp
     */
    public static async getService(context: IParam): Promise<IEntityLocalDataService<IIBIZBOOK>> {
        return App.getDataService('IBIZBOOK', context);
    }

    /**
     * 获取是否缓存
     *
     * @memberof IBIZBOOKDTOHelp
     */
    public static getEnableCache(){
        return false;
    }

    /**
     * DTO转化成数据对象
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} source dto对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async toDataObj(context: IContext, source: IParam) {
        const _data: any = {};
        //  数组
        _data.array = source.array;
        //  图书作者
        _data.author = source.author;
        //  图书数量
        _data.booknumber = source.booknumber;
        //  借阅人
        _data.borrower = source.borrower;
        //  借阅人1
        _data.borrower1 = source.borrower1;
        //  借阅人1_ID
        _data.borrower1id = source.borrower1id;
        //  借阅人2
        _data.borrower2 = source.borrower2;
        //  借阅人2_ID
        _data.borrower2_id = source.borrower2_id;
        //  借阅人3
        _data.borrower3 = source.borrower3;
        //  借阅人3_ID
        _data.borrower3_id = source.borrower3_id;
        //  借阅人ID
        _data.borrowerid = source.borrowerid;
        //  图书借阅状态
        _data.borrowstatus = source.borrowstatus;
        //  借阅方式
        _data.borrowway = source.borrowway;
        //  建立时间
        _data.createdate = source.createdate;
        //  建立人
        _data.createman = source.createman;
        //  图书标识
        _data.ibizbookid = source.ibizbookid;
        //  图书名称
        _data.ibizbookname = source.ibizbookname;
        //  图标
        _data.icon = source.icon;
        //  借出日期
        _data.lendouttime = source.lendouttime;
        //  图书出版社
        _data.press = source.press;
        //  图书价格
        _data.price = source.price;
        //  归还图馆
        _data.returnlib = source.returnlib;
        //  归还日期
        _data.returntime = source.returntime;
        //  图书销售状态
        _data.sailstate = source.sailstate;
        //  步骤
        _data.stepstatus = source.stepstatus;
        //  图书描述
        _data.subtext = source.subtext;
        //  标签
        _data.tag = source.tag;
        //  图书类型
        _data.type = source.type;
        //  更新时间
        _data.updatedate = source.updatedate;
        //  更新人
        _data.updateman = source.updateman;
        //  处理预置字段（以srf开头）
        if (source && Object.keys(source).length > 0) {
            Object.keys(source).forEach((key:string) =>{
                if(key.startsWith('srf')){
                    _data[key] = source[key];
                }
            })
        }
        return _data;
    }

    /**
     * 转化数据（DTO转化成数据对象）
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} data 数据对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async toDataObjArray(context: IContext, data: any[]) {
        const _data: any[] = [];
        if (data && Array.isArray(data) && data.length > 0) {
            for (let i = 0; i < data.length; i++) {
                const tempdata = await this.toDataObj(context, data[i]);
                _data.push(tempdata);
            }
        }
        return _data;
    }

    /**
     * 数据对象转化成DTO
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} source 数据对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async toDto(context: IContext, source: IParam) {
        const _data: any = {};
        const excludes: string[] = [];
        //  数组
        if(source.hasOwnProperty('array')){
            _data.array = source.array;
        }
        //  图书作者
        if(source.hasOwnProperty('author')){
            _data.author = source.author;
        }
        //  图书数量
        if(source.hasOwnProperty('booknumber')){
            _data.booknumber = source.booknumber;
        }
        //  借阅人
        if(source.hasOwnProperty('borrower')){
            _data.borrower = source.borrower;
        }
        //  借阅人1
        if(source.hasOwnProperty('borrower1')){
            _data.borrower1 = source.borrower1;
        }
        //  借阅人1_ID
        if(source.hasOwnProperty('borrower1id')){
            _data.borrower1id = source.borrower1id;
        }
        //  借阅人2
        if(source.hasOwnProperty('borrower2')){
            _data.borrower2 = source.borrower2;
        }
        //  借阅人2_ID
        if(source.hasOwnProperty('borrower2_id')){
            _data.borrower2_id = source.borrower2_id;
        }
        //  借阅人3
        if(source.hasOwnProperty('borrower3')){
            _data.borrower3 = source.borrower3;
        }
        //  借阅人3_ID
        if(source.hasOwnProperty('borrower3_id')){
            _data.borrower3_id = source.borrower3_id;
        }
        //  借阅人ID
        if(source.hasOwnProperty('borrowerid')){
            _data.borrowerid = source.borrowerid;
        }
        //  图书借阅状态
        if(source.hasOwnProperty('borrowstatus')){
            _data.borrowstatus = source.borrowstatus;
        }
        //  借阅方式
        if(source.hasOwnProperty('borrowway')){
            _data.borrowway = source.borrowway;
        }
        //  建立时间
        if(source.hasOwnProperty('createdate')){
            _data.createdate = source.createdate;
        }
        //  建立人
        if(source.hasOwnProperty('createman')){
            _data.createman = source.createman;
        }
        //  图书标识
        if(source.hasOwnProperty('ibizbookid')){
            _data.ibizbookid = source.ibizbookid;
        }
        //  图书名称
        if(source.hasOwnProperty('ibizbookname')){
            _data.ibizbookname = source.ibizbookname;
        }
        //  图标
        if(source.hasOwnProperty('icon')){
            _data.icon = source.icon;
        }
        //  借出日期
        if(source.hasOwnProperty('lendouttime')){
            _data.lendouttime = source.lendouttime;
        }
        //  图书出版社
        if(source.hasOwnProperty('press')){
            _data.press = source.press;
        }
        //  图书价格
        if(source.hasOwnProperty('price')){
            _data.price = source.price;
        }
        //  归还图馆
        if(source.hasOwnProperty('returnlib')){
            _data.returnlib = source.returnlib;
        }
        //  归还日期
        if(source.hasOwnProperty('returntime')){
            _data.returntime = source.returntime;
        }
        //  图书销售状态
        if(source.hasOwnProperty('sailstate')){
            _data.sailstate = source.sailstate;
        }
        //  步骤
        if(source.hasOwnProperty('stepstatus')){
            _data.stepstatus = source.stepstatus;
        }
        //  图书描述
        if(source.hasOwnProperty('subtext')){
            _data.subtext = source.subtext;
        }
        //  标签
        if(source.hasOwnProperty('tag')){
            _data.tag = source.tag;
        }
        //  图书类型
        if(source.hasOwnProperty('type')){
            _data.type = source.type;
        }
        //  更新时间
        if(source.hasOwnProperty('updatedate')){
            _data.updatedate = source.updatedate;
        }
        //  更新人
        if(source.hasOwnProperty('updateman')){
            _data.updateman = source.updateman;
        }
        // 附加额外数据
        if (source && Object.keys(source).length > 0 && keys) {
            Object.keys(source).forEach((key: string) => {
                if (!keys.includes(key) && !excludes.includes(key)) {
                    _data[key] = source[key];
                }
            })
        }
        return _data;
    }

    /**
     * 转化数组(数据对象转化成DTO数组)
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam[]} data 数据对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async toDtoArray(context: IContext, data: IParam[]) {
        const _data: any[] = [];
        if (data && Array.isArray(data) && data.length > 0) {
            for (let i = 0; i < data.length; i++) {
                const tempdata = await this.toDto(context, data[i]);
                _data.push(tempdata);
            }
        }
        return _data;
    }

    /**
     * 处理响应DTO对象
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} data 数据对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async set(context: IContext, data: IParam) {
        const _data: IParam = await this.toDataObj(context, data);
        return _data;
    }

    /**
     * 处理请求数据对象
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} data 数据对象
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async get(context: IContext, data: IParam = {}) {
        return await this.toDto(context, data);
    }

    /**
     * 获取缓存数据
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {string} srfkey 数据主键
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async getCacheData(context: IContext, srfkey: string) {
        return {};
    }

    /**
     * 获取缓存数组
     *
     * @static
     * @param {IContext} context 应用上下文
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async getCacheDataArray(context: IContext) {
        return [];
    }

    /**
     * 设置缓存数据
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {IParam} data 数据
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async setCacheData(context: IContext, data: IParam) {
    }

    /**
     * 设置缓存数组
     *
     * @static
     * @param {IContext} context 应用上下文
     * @param {any[]} data 数据
     * @return {*} 
     * @memberof IBIZBOOKDTOHelp
     */
    public static async setCacheDataArray(context: IContext, data: any[]) {
    }
}
